package com.wyd.wenyongdaAdmin.xo.admin.dict.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wyd.wenyongdaAdmin.commons.model.admin.dict.dto.DictDTO;
import com.wyd.wenyongdaAdmin.commons.model.admin.dict.entity.DictEntity;
import com.wyd.wenyongdaAdmin.commons.model.admin.dict.vo.DictVO;
import com.wyd.wenyongdaAdmin.xo.admin.dict.mapper.DictEntryMapper;
import com.wyd.wenyongdaAdmin.xo.admin.dict.mapper.DictMapper;
import com.wyd.wenyongdaAdmin.xo.admin.dict.service.IDictService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class DictServiceImpl extends ServiceImpl<DictMapper, DictEntity> implements IDictService {

    private static final Logger log = LoggerFactory.getLogger(DictServiceImpl.class);

    private DictEntryMapper dictEntryMapper;

    @Autowired
    public void setDictEntryMapper(DictEntryMapper dictEntryMapper) {
        this.dictEntryMapper = dictEntryMapper;
    }

    @Override
    public PageInfo<DictDTO> selectPageWithCount(Integer pageNumber, Integer pageSize, DictDTO dictDTO) {
        QueryWrapper<DictEntity> queryWrapper = new QueryWrapper<DictEntity>();
        if (ObjectUtil.isNotNull(dictDTO)) {
            if (StrUtil.isNotBlank(dictDTO.getName())) {
                queryWrapper.like("name", dictDTO.getName());
            }
            if (StrUtil.isNotBlank(dictDTO.getType())) {
                queryWrapper.like("type", dictDTO.getType());
            }
        }
        PageHelper.startPage(pageNumber, pageSize);
        List<DictEntity> dictEntityList = this.baseMapper.selectList(queryWrapper);
        PageInfo pageInfo = new PageInfo<>(dictEntityList);
        List<DictDTO> dictDTOList = new ArrayList<>();
        DictDTO dict = null;
        for (DictEntity dictEntity: dictEntityList) {
            dict = new DictDTO();
            BeanUtil.copyProperties(dictEntity, dict);
            dictDTOList.add(dict);
        }
        pageInfo.setList(dictDTOList);
        PageHelper.clearPage();
        return pageInfo;
    }

    @Override
    public Integer addDict(DictDTO dictDTO) {
        if (ObjectUtil.isNotNull(dictDTO)) {
            DictEntity dict = new DictEntity();
            BeanUtil.copyProperties(dictDTO, dict);
            return this.baseMapper.insert(dict);
        } else {
            return 0;
        }

    }

    @Override
    public Integer updateDict(DictDTO dictDTO) {
        if (ObjectUtil.isNotNull(dictDTO)) {
            DictEntity dict = new DictEntity();
            BeanUtil.copyProperties(dictDTO, dict);
            return this.baseMapper.updateById(dict);
        } else {
            return 0;
        }

    }

    @Override
    public Integer deleteDict(List<Long> ids) {
        if (ids.size() > 0) {
            return this.baseMapper.deleteBatchIds(ids);
        } else {
            return 0;
        }
    }

    @Override
    public List<DictVO> getDictWithDictEntry() {
        //List<DictEntity> dictEntityList = this.baseMapper.selectList(new QueryWrapper<DictEntity>());
        //List<DictDTO> dictDTOList = new ArrayList<>();
        //DictDTO dict = null;
        //for (DictEntity dictEntity: dictEntityList) {
        //    dict = new DictDTO();
        //    BeanUtil.copyProperties(dictEntity, dict);
        //    dictDTOList.add(dict);
        //}
        //List<DictEntryEntity> dictEntryEntityList = this.dictEntryMapper.selectList(new QueryWrapper<DictEntryEntity>());
        //List<DictEntryDTO> dictEntryDTOList = new ArrayList<>();
        //DictEntryDTO dictEntry = null;
        //for (DictEntryEntity dictEntryEntity : dictEntryEntityList) {
        //    dictEntry = new DictEntryDTO();
        //    BeanUtil.copyProperties(dictEntryEntity, dictEntry);
        //    dictEntryDTOList.add(dictEntry);
        //}
        //List<DictVO> dictVOList = new ArrayList<>();
        //
        //for (DictDTO dictDTO : dictDTOList) {
        //    List<DictEntryVO> dictEntryVOList = new ArrayList<>();
        //    for (DictEntryDTO dictEntryDTO : dictEntryDTOList) {
        //        if (Objects.equals(dictDTO.getId(), dictEntryDTO.getDictId())) {
        //            DictEntryVO dictEntryVO = new DictEntryVO();
        //            HashMap<String, String> mapping = new HashMap<>();
        //            mapping.put("name", "label");
        //            BeanUtil.copyProperties(dictEntryDTO, dictEntryVO, CopyOptions.create().setFieldMapping(mapping));
        //            dictEntryVOList.add(dictEntryVO);
        //        }
        //    }
        //    DictVO dictVO = new DictVO();
        //    BeanUtil.copyProperties(dictDTO,dictVO);
        //    dictVO.setEntry(dictEntryVOList);
        //    dictVOList.add(dictVO);
        //}
        //return dictVOList;
        List<DictVO> dictVOList = this.baseMapper.selectDictVoWithDictEntryVO();
        if (dictVOList.size() > 0) {
            return dictVOList;
        } else {
            return null;
        }
    }
}
